package com.example.diskfilesystem.disk;

import com.example.diskfilesystem.show.ShowAlert;
import config.Config;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;

//模拟磁盘类
public class Disk {

    private RandomAccessFile file;

    //打开或创建一个用于模拟磁盘的文件
    public Disk(String name) throws IOException {
        file = new RandomAccessFile(name, "rw");//rw：以读取、写入方式打开指定文件。如果该文件不存在，则尝试创建文件
        if (file.length() < Config.DISK_SIZE) {
            file.setLength(Config.DISK_SIZE);//预设磁盘大小
        }
    }
    //向指定块写入64字节数据
    public void writeBlock(int blockIndex, byte[] data) throws IOException {
        if (data.length != Config.BLOCK_SIZE) {
            throw new IllegalArgumentException("Block size mismatch.");
        }
        file.seek((long) blockIndex * Config.BLOCK_SIZE);//文件记录指针定位到块起始位置
        file.write(data);//从指针位置开始写入数据
    }

    //从指定块读取64字节数据
    public byte[] readBlock(int blockIndex) throws IOException {
        if (blockIndex < 0 || blockIndex >= Config.BLOCK_COUNT) {
            //ShowAlert.showAlert("不存在该块");
            System.out.println("不存在该块");
            return null;
            //throw new IllegalArgumentException("不存在该块");
        }
        byte[] buffer = new byte[Config.BLOCK_SIZE];  //创建缓冲区

        file.seek((long) blockIndex * Config.BLOCK_SIZE);

        file.readFully(buffer);//从指定位置读取指定长度数据到缓冲区
        return buffer;
    }

    //清除指定块内信息
    public void clearBlock(int blockIndex) throws IOException {
        byte[] empty = new byte[Config.BLOCK_SIZE];
        Arrays.fill(empty, (byte) 0);
        writeBlock(blockIndex, empty);
    }

    //关闭磁盘文件
    public void close() throws IOException {
        file.close();
    }

}
